home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
iguana
/
incosrc
/
incosrc.exe
/
SPI
/
SPI.ASM
< prev
next >
Wrap
Assembly Source File
|
1994-06-09
|
32KB
|
1,233 lines
; ------------------------------ SPI.ASM ---------------------
; Spiral.
; (C) 1993 bye JARE.
TRACE = 0
.MODEL SMALL
.STACK 1400
.386P
DOSSEG
LOCALS
JUMPS
INCLUDE VGASM.INC
INCLUDE VBLIB.INC
INCLUDE VTASM.INC
SCRW = 80
SPIRALH = 197
POS1 = 35*2
.DATA
SP01 SEGMENT PARA PUBLIC
EXTRN SPIRALPIX: BYTE
ENDS
DGROUP GROUP SP01
;==================================================
SetDisplayPage MACRO p
MOV BX,p
MOV DX,3D4h ; Set the display page.
MOV AL,0Ch
MOV AH,BH
OUT DX,AX
INC AL
MOV AH,BL
OUT DX,AX
ENDM
WaitStatic MACRO c
LOCAL @@w1
MOV CX,c
;MOV CX,1
@@w1:
PUSH CX
CALL VBLVSync
CALL CallMusic
POP CX
LOOP @@w1
ENDM
; Macros para volcar las espirales.
DumpBigSpiral MACRO p
MOV [PixelationSkipOffset],SCRW
MOV BX,-SPIRALH
MOV DI,(200*p+1)*SCRW+(160-SPIRALH/2) / 4
MOV AH,1 SHL ((160-SPIRALH/2) MOD 4)
CALL PixelateBitmap
ENDM
DumpFirstSpiral MACRO p
MOV [PixelationSkipOffset],0
MOV BX,POS1
MOV DI,p*200*SCRW
MOV AH,1 SHL (0 MOD 4)
CALL PixelateBitmap
ENDM
DumpSecondSpiral MACRO p
MOV [PixelationSkipOffset],0
MOV BX,-POS1
MOV DI,p*200*SCRW + (320-POS1) / 4
MOV AH,1 SHL ((320-POS1) MOD 4)
CALL PixelateBitmap
ENDM
DumpThirdSpiral MACRO p
MOV [PixelationSkipOffset],SCRW
MOV BX,-POS1
MOV DI,p*200*SCRW + SCRW*(200-POS1)
MOV AH,1 SHL (0 MOD 4)
CALL PixelateBitmap
ENDM
DumpFourthSpiral MACRO p
MOV [PixelationSkipOffset],SCRW
MOV BX,POS1
MOV DI,p*200*SCRW + SCRW*(200-POS1)+(320-POS1) / 4
MOV AH,1 SHL ((320-POS1) MOD 4)
CALL PixelateBitmap
ENDM
SetFirstColor MACRO p
MOV BYTE PTR [FadeData&p],AL
MOV BYTE PTR [FadeData&p+1],AL
MOV BYTE PTR [FadeData&p+2],AH
MOV BYTE PTR [FadeData&p+3],AL
MOV BYTE PTR [FadeData&p+4],AH
MOV BYTE PTR [FadeData&p+5],AL
SHR AL,1
MOV [CenterColor&p],AL
MOV [CenterColor&p+1],AL
MOV [CenterColor&p+2],AL
ENDM
SetSecondColor MACRO p
MOV BYTE PTR [FadeData&p],AL
MOV BYTE PTR [FadeData&p+1],AH
MOV BYTE PTR [FadeData&p+2],AL
MOV BYTE PTR [FadeData&p+3],AH
MOV BYTE PTR [FadeData&p+4],AH
MOV BYTE PTR [FadeData&p+5],AL
; SHR AL,1
MOV [CenterColor&p],AL
MOV [CenterColor&p+1],AH
MOV [CenterColor&p+2],AL
ENDM
;===================================================
.CODE
A_GDT label byte
NullDes dw 0, 0, 0, 0
CodeDes dw 0ffffh ; limit (bits 24-31)
db 0, 0, 0 ; base (bits 0-23)
db 10011011B ; present / DPL 0 / code / non conforming / readable
db 11001111B ; size 4Gb / 32 bits / limit
db 0 ; base
DataDes dw 0ffffh ; limit (bits 24-31)
db 0, 0, 0 ; base (bits 0-23)
db 10010011B ; present / DPL 0 / data / writeable
db 10001111B ; size 4Gb / 32 bits / limit
db 0 ; base
A_GDT_PTR dw 17h ; gdt size
dd 0 ; gdt linear base
;===================================================
.CODE
.STARTUP
MOV AH,1
INT 16h
JZ @@dospi
XOR AH,AH
INT 16h
MOV AX,4C00h
INT 21h
@@dospi:
CLD
; Protected mode fixup. Some programs like TLink from Borland leave the
; 386 segment registers unusable. This is to get them back.
SMSW AX
TEST AX,1
JNZ @@alreadyPM ; Do not fix if we are already in PM.
PUSH CS
SUB EAX,EAX
POP AX
SHL EAX,4
ADD EAX,OFFSET A_GDT
MOV DWORD PTR CS:[A_GDT_PTR].2,EAX
LGDT QWORD PTR CS:A_GDT_PTR
SMSW AX
OR AX,1
LMSW AX ; now running on protected mode
JMP @@ll1 ; clear prefetch queue
@@ll1:
MOV AX,10h ; adjust data selectors
MOV GS,AX
MOV FS,AX
MOV EAX,CR0
AND EAX,0FFFFFFFEh
MOV CR0,EAX ; now running on real mode
JMP @@ll2 ; clear prefetch queue
@@ll2:
XOR AX,AX
MOV FS,AX
MOV GS,AX
@@alreadyPM:
; End of PM fixup.
CALL SetupSpiralVideo
SetDisplayPage 0
VSync
MOV CS:[VBLFullHandler],OFFSET SpiralFullHandler
XOR SI,SI
CALL InitializeTimerVBL
CALL VBLVSync
CALL InitMusic
CALL VTDisconnectTimer
; CALL VTBeginSync
; CALL VTWaitForStart
MOV BX,6
MOV DH,9
MOV DL,49
CALL VTMiddleSync
WaitStatic 100
DumpFirstSpiral 0
DumpFirstSpiral 1
DumpSecondSpiral 0
DumpSecondSpiral 1
DumpThirdSpiral 1
DumpFourthSpiral 1
CALL FlipSpiralColors
DumpThirdSpiral 0
DumpFourthSpiral 0
MOV CX,32
@@l1:
PUSH CX
CALL VBLVSync
CALL CallMusic
CALL VBLVSync
CALL CallMusic
POP CX
PUSH CX
MOV AX,32
SUB AL,CL
SetFirstColor 1
POP CX
LOOP @@l1
MOV CX,32
@@l2:
PUSH CX
CALL VBLVSync
CALL CallMusic
CALL VBLVSync
CALL CallMusic
POP CX
PUSH CX
MOV AX,64
SUB AL,CL
SetFirstColor 1
MOV AX,32
SUB AL,CL
SetFirstColor 2
POP CX
LOOP @@l2
MOV CX,32
@@l3:
PUSH CX
CALL VBLVSync
CALL CallMusic
CALL VBLVSync
CALL CallMusic
POP CX
PUSH CX
MOV AX,64
SUB AL,CL
SetFirstColor 2
POP CX
LOOP @@l3
WaitStatic 100
MOV CX,64
@@w3:
PUSH CX
MOV CX,128
MOV DI,OFFSET NormalPalette+128*3
XOR DX,DX
CALL FadeCol
CALL VBLVSync
MOV CX,64
MOV SI,OFFSET NormalPalette+(128+64)*3
MOV AL,128+64
CALL DumpPalette
CALL CallMusic
CALL VBLVSync
MOV CX,64
MOV SI,OFFSET NormalPalette+128*3
MOV AL,128
CALL DumpPalette
CALL CallMusic
POP CX
LOOP @@w3
CALL CallMusic
CALL VBLVSync
CALL CallMusic
CALL VBLVSync
MOV AL,[SpiralPos1]
MOV [SpiralPos2],AL
XOR AX,AX
SetFirstColor 2
SetDisplayPage 200*SCRW
WaitStatic 100
CALL CallMusic
CALL CallMusic
CALL CallMusic
DumpBigSpiral 0
CALL VBLVSync
CALL CallMusic
CALL VBLVSync
CALL CallMusic
CALL CallMusic
CALL CallMusic
DumpBigSpiral 1
CALL CallMusic
CALL FlipSpiralColors
CALL CallMusic
DumpThirdSpiral 0
CALL CallMusic
DumpFourthSpiral 0
MOV [SecondPalRot],OFFSET PalDec
MOV [SpecialSecondPal],1
MOV CX,64
@@w4:
PUSH CX
MOV AX,64
SUB AL,CL
SetSecondColor 2
CALL VBLVSync
CALL CallMusic
CALL VBLVSync
CALL CallMusic
POP CX
LOOP @@w4
WaitStatic 100
;-----------------
SetDisplayPage 0
CALL VBLVSync
CALL CallMusic
CALL CallMusic
CALL CallMusic
CALL CallMusic
CALL CopyScreen123
MOV CX,1258
RotationLoop:
PUSH CX
CALL VBLVSync
CALL SetSpiDisplayPage
INC [FrameCounter]
CMP [FrameCounter],3
JC @@1
MOV [FrameCounter],0
@@1:
SetBorder 63,0,0
CALL EraseSpiral
SetBorder 0, 63, 0
CALL CallMusic
CALL DrawRotatingSpiral
SetBorder 0, 63, 63
ADD [SpiralPosRot],6
CMP [SpiralPosRot], OFFSET CircleByeBye
JC @@c1
MOV [SpiralPosRot], OFFSET CirclePosition
@@c1:
CALL CallMusic
MOV AH,1
INT 16h
JNZ FinalKey
POP CX
LOOP RotationLoop
MOV [SpiralPosRot],OFFSET CircleByeBye
MOV CX,58
ByeByeLoop:
PUSH CX
CALL VBLVSync
CALL SetSpiDisplayPage
INC [FrameCounter]
CMP [FrameCounter],3
JC @@1
MOV [FrameCounter],0
@@1:
SetBorder 63,0,0
CALL EraseSpiral
SetBorder 0, 63, 0
CALL CallMusic
CALL DrawRotatingSpiral
SetBorder 0, 63, 63
ADD [SpiralPosRot],6
CALL CallMusic
MOV AH,1
INT 16h
JNZ FinalKey
POP CX
LOOP ByeByeLoop
SUB [SpiralPosRot],6
MOV CX,210
WaitLoop:
PUSH CX
CALL VBLVSync
CALL SetSpiDisplayPage
INC [FrameCounter]
CMP [FrameCounter],3
JC @@1
MOV [FrameCounter],0
@@1:
CALL CallMusic
CALL EraseSpiral
CALL CallMusic
MOV AH,1
INT 16h
JNZ FinalKey
POP CX
LOOP WaitLoop
MOV CX,64
FadeLoop:
PUSH CX
MOV AX,CX
DEC AX
SetFirstColor 1
MOV AX,CX
DEC AX
SetSecondColor 2
CALL VBLVSync
CALL CallMusic
POP CX
LOOP FadeLoop
JMP Quitting
FinalKey:
XOR AH,AH
INT 16h
Quitting:
ByeBye:
CALL EndTimerVBL
CALL VTConnectTimer
COMMENT #
CALL ZeroPalette
MOV AX,3
INT 10h
#
CALL RestoreSystemTime
MOV AX,4C00h
INT 21h
; =======================================
PalInc:
INC BL
CMP BL,50
JC @@1
XOR BL,BL
@@1:
RET
PalDec:
DEC BL
CMP BL,50
JC @@1
MOV BL,49
@@1:
RET
SpiralFullHandler:
PUSH DS
MOV AX,@data
MOV DS,AX
PUSHA
MOV SI,OFFSET SpiralPalette
MOV CX,50
MOV AL,1
CALL DumpPalette
CMP [WorkSecondPal],0
JZ @@c1
MOV SI,OFFSET SpiralPalette+50*3
MOV CX,50
MOV AL,51
CALL DumpPalette
@@c1:
MOV SI,OFFSET CenterColor1
MOV CX,2
MOV AL,101
CALL DumpPalette
MOV DI,OFFSET SpiralPalette
MOV BL,[SpiralPos1]
MOV DX,[FadeData1]
MOV CX,[FadeData1+2]
MOV AX,[FadeData1+4]
CALL GenerateSpiPal
CALL [WORD PTR FirstPalRot]
MOV [SpiralPos1],BL
CMP [WorkSecondPal],0
JZ @@c4
MOV DI,OFFSET SpiralPalette+3*50
MOV BL,[SpiralPos2]
MOV DX,[FadeData2]
MOV CX,[FadeData2+2]
MOV AX,[FadeData2+4]
CMP [SpecialSecondPal],1
JNZ @@normspal
CALL GenerateGraySpiral
JMP @@gc1
@@normspal:
CALL GenerateSpiPal
@@gc1:
CALL [WORD PTR SecondPalRot]
MOV [SpiralPos2],BL
@@c4:
POPA
POP DS
RET
GenerateSpiPal:
PUSH BX
MOV SI,50
@@l1:
CMP BL,25
JC @@other
MOV BYTE PTR [DI],DH
MOV BYTE PTR [DI+1],CH
MOV BYTE PTR [DI+2],AH
JMP SHORT @@goon
@@other:
MOV BYTE PTR [DI],DL
MOV BYTE PTR [DI+1],CL
MOV BYTE PTR [DI+2],AL
@@goon:
INC BL
CMP BL,50
JC @@c2
XOR BL,BL
@@c2:
ADD DI,3
DEC SI
JNZ @@l1
POP BX
RET
GenerateGraySpiral:
PUSH BX
CMP BL,25
JC @@down
SUB DL,50
ADD DL,BL
SUB DL,50
ADD DL,BL
JMP SHORT @@gc0
@@down:
SUB DL,BL
SUB DL,BL
@@gc0:
MOV SI,50
@@l1:
MOV DH,DL
TEST DH,80h
JZ @@set
XOR DH,DH
@@set:
MOV BYTE PTR [DI],0 ;DH
MOV BYTE PTR [DI+1],DH
MOV BYTE PTR [DI+2],0 ;DH
CMP BL,25
JC @@other
ADD DL,2
ADD DL,2
@@other:
DEC DL
DEC DL
INC BL
CMP BL,50
JC @@c2
XOR BL,BL
@@c2:
ADD DI,3
DEC SI
JNZ @@l1
POP BX
RET
; =======================================
SetupSpiralVideo:
COMMENT #
CALL ZeroPalette
MOV AX,13h
INT 10h
CALL ZeroPalette
VSync
MOV DX,3D4h ; Set the display page to 0.
MOV AL,0Ch
XOR AH,AH
OUT DX,AX
INC AL
OUT DX,AX
VSync
; Setup the video addressing mode.
MOV DX,3C0h
MOV AL,30h
OUT DX,AL
MOV AL,01100001b
OUT DX,AL
MOV DX,3c4h
MOV AX,604h ; "Unchain my heart". And my VGA...
OUT DX,AX
MOV AX,0F02h ; All planes
OUT DX,AX
; Comienzo del modo de Hz reducidos.
MOV DX,3D4h
MOV CX,18h
MOV SI,OFFSET CRTCregs
@@cl1:
LODSW
OUT DX,AX
LOOP @@cl1
; Final del modo de Hz reducidos.
MOV AX,14h ; Disable dword mode
OUT DX,AX
MOV AX,0E317h ; Enable byte mode.
OUT DX,AX
MOV DX,3C4h
MOV AX,0F02h ; All planes at a time.
OUT DX,AX
MOV DX,3CEh ; Bitmask...
MOV AX,0FF08h ;00008h ; 00000000b
OUT DX,AX
; VSync
MOV AX,0A000h
MOV ES,AX
MOV SI,SCRW*(216*2 + 16)
MOV DI,0
MOV CX,8000h
XOR AX,AX
REP STOSW
MOV DI,0
MOV CX,200*SCRW/2
MOV AX,0A0B0H
REP STOSW
;#
MOV DX,3CEh ; Bitmask...
MOV AX,0FF08h ; 11111111b
OUT DX,AX
MOV SI,OFFSET NormalPalette
MOV CX,256
XOR AL,AL
CALL DumpPalette
RET
; =======================================
GetRandomNumber:
MOV AX,[RandSeed]
MOV BX,[RandSeed2]
MOV BP,[RandSeed3]
ADD AX,0a137h
ADD BX,63f7h
ADD BP,784Ah
ROL AX,2
MOV [RandSeed],AX
ADD BX,AX
ROR BX,1
MOV [RandSeed2],BX
SUB BP,BX
XOR AX,BP
MOV [RandSeed3],BP
ADD AX,BX
RET
; =======================================
; En BX se le da el tamaño de destino.
; En DI la dirección final de la pantalla.
; En AH el bitplane de inicio.
.DATA
EVENDATA
ScaleHData DW 320 DUP (?)
ScaleVData DW 320 DUP (?)
.CODE
PixelateBitmap:
MOV AL,AH
ROR AL,4
OR AH,AL
PUSH AX
PUSH DI
MOV DI,OFFSET ScaleVData
MOV SI,OFFSET ScaleHData
OR BX,BX
JNS @@c1
XCHG SI,DI
NEG BX
@@c1:
PUSH SI
PUSH BX
CALL ScaleVSize
POP BX
POP DI
PUSH BX
CALL ScaleHSize
SetBorder 63,0,0
MOV AX,0A000h
MOV ES,AX
POP CX
POP DI
POP AX
MOV BP,CX
MOV BX,OFFSET ScaleHData
MOV SI,OFFSET DGROUP:SPIRALPIX
@@lh:
PUSH CX
PUSH DI
PUSH AX
PUSH SI
PUSH BX
MOV DX,3C4h
MOV AL,02h ; One plane at a time.
OUT DX,AX
MOV BX,OFFSET ScaleVData
MOV CX,BP
PUSH BP
MOV BP,[PixelationSkipOffset]
MOV AX,2
@@skip:
MOV DL,[SI]
ADD SI,[BX]
ADD DI,BP
ADD BX,AX
DEC CX
JZ @@bail
OR DL,DL
JZ @@skip
MOV BP,SCRW
JMP @@lv
@@bail:
JMP @@nxc
@@lv:
REPT 4
MOV DL,[SI]
OR DL,DL
JZ @@bail
MOV ES:[DI],DL
ADD DI,BP
ADD SI,[BX]
ADD BX,AX
DEC CX
JZ @@nxc
ENDM
JMP @@lv
@@nxc:
POP BP
POP BX
POP SI
POP AX
POP DI
ADD SI,[BX]
ADD BX,2
ROL AH,1
JNC @@goon
INC DI
@@goon:
POP CX
LOOP @@lh
SetBorder 0, 0, 63
RET
; =======================================
; En BX se le da el tamaño de destino.
; En DI la zona donde dejar los datos.
ScaleVSize:
PUSH BX
XOR AX,AX
MOV DX,SPIRALH
CMP DX,BX
JC @@nored
XCHG DX,AX ; Must reduce the bitmap, skipping points.
DIV BX
@@nored:
; AX == incremento constante.
; DX == incremento residual.
; BX == modulo del residual.
PUSH DX
MOV DX,SPIRALH ; Escala el inc cte.
MUL DX
POP DX
POP CX
MOV SI,AX
MOV BP,BX
SHR BP,1
@@lp:
MOV [DI],SI
SUB BP,DX
JNC @@norm
ADD BP,BX
ADD WORD PTR [DI],SPIRALH
@@norm:
ADD DI,2
LOOP @@lp
RET
; =======================================
; En BX se le da el tamaño de destino.
; En DI la zona donde dejar los datos.
ScaleHSize:
PUSH BX
XOR AX,AX
MOV DX,SPIRALH
CMP DX,BX
JC @@nored
XCHG DX,AX ; Must reduce the bitmap, skipping points.
DIV BX
@@nored:
; AX == incremento constante.
; DX == incremento residual.
; BX == modulo del residual.
POP CX
MOV SI,AX
MOV BP,BX
SHR BP,1
@@lp:
MOV [DI],SI
SUB BP,DX
JNC @@norm
ADD BP,BX
ADD WORD PTR [DI],1
@@norm:
ADD DI,2
LOOP @@lp
RET
; =======================================
FlipEm MACRO r
LOCAL @@d1, @@d2, @@d3, @@go
OR r,r
JZ @@go
CMP r,51
JC @@d1
CMP r,101
JC @@d2
JZ @@d3
SUB r,1+50
@@d1:
ADD r,50+50
@@d2:
SUB r,50+1
@@d3:
INC r
@@go:
ENDM
FlipSpiralColors:
MOV SI,OFFSET DGROUP:SP01
MOV CX,197*197 / 2
@@l1:
MOV AX,[SI]
FlipEm AL
FlipEm AH
MOV [SI],AX
ADD SI,2
LOOP @@l1
MOV AL,[SI]
FlipEm AL
MOV [SI],AL
RET
; =======================================
DOCopy:
PUSH DS
MOV AX,0A000h
MOV DS,AX
MOV ES,AX
MOV CX,SCRW*200
MOV SI,200*SCRW
REP MOVSB
POP DS
RET
CopyScreen123:
MOV DX,3C4h
MOV AX,0F02h ; All planes at a time.
OUT DX,AX
MOV DX,3CEh ; Bitmask...
MOV AX,00008h ; 00000000b
OUT DX,AX
MOV DI,200*SCRW*0
; CALL DOCopy
CALL CallMusic
CALL CallMusic
CALL CallMusic
MOV DI,200*SCRW*2
CALL DOCopy
CALL CallMusic
CALL CallMusic
CALL CallMusic
MOV DI,200*SCRW*3
CALL DOCopy
MOV DX,3CEh ; Bitmask...
MOV AX,0FF08h ; 11111111b
OUT DX,AX
RET
; =======================================
; Pone la espiralilla de tamaño BX
; en el punto de centro SI,DI.
; Base de la pantalla en BP.
; Retorna en DI el OFFSET donde la pintó.
DrawSpiralXY:
MOV AX,BX
CMP AX,0
JGE @@c1
NEG AX
@@c1:
SHR AX,1
SUB SI,AX
SUB DI,AX
MOV AX,SCRW
MUL DI
MOV DI,AX
MOV CX,SI
SHR SI,2
ADD DI,SI
AND CL,3
MOV AH,1
SHL AH,CL
PUSH DI
ADD DI,BP
CALL PixelateBitmap
POP DI
RET
; =======================================
EraseSpiral:
PUSH DS
TEST [FrameCounter],2
JZ SHORT @@frame2
MOV BP,SCRW*200*2 ; 2 -> 2
MOV DI,OFFSET SpiPosScr2
JMP SHORT @@endframe
@@frame2:
TEST [FrameCounter],1
JZ SHORT @@frame3
MOV BP,SCRW*200*1 ; 1 -> 1
MOV DI,OFFSET SpiPosScr1
JMP SHORT @@endframe
@@frame3:
MOV BP,SCRW*200*0 ; 0 -> 0
MOV DI,OFFSET SpiPosScr0
@@endframe:
MOV DX,3C4h
MOV AX,0F02h ; All planes at a time.
OUT DX,AX
MOV DX,3CEh ; Bitmask...
MOV AX,00008h ; 00000000b
OUT DX,AX
; MOV CX,57
MOV CX,[DI+2]
MOV DI,[DI]
MOV SI,DI
ADD DI,BP
ADD SI,SCRW*200*3
MOV AX,0A000h
MOV ES,AX
MOV DS,AX
@@l1:
REPT (57+3)/4
MOVSB
ENDM
ADD DI,SCRW-((57+3)/4)
ADD SI,SCRW-((57+3)/4)
LOOP @@l1
POP DS
MOV DX,3CEh ; Bitmask...
MOV AX,0FF08h ; 11111111b
OUT DX,AX
RET
; =======================================
SetSpiDisplayPage:
MOV DX,3D4h
MOV BX,SCRW*200*2 ; 2 -> 2
TEST [FrameCounter],2
JNZ SHORT @@scrst
MOV BX,SCRW*200*1 ; 1 -> 1
TEST [FrameCounter],1
JNZ SHORT @@scrst
MOV BX,SCRW*200*0 ; 0 -> 0
@@scrst:
MOV AL,0Ch
MOV AH,BH
OUT DX,AX
INC AL
MOV AH,BL
OUT DX,AX
RET
; =======================================
DrawRotatingSpiral:
TEST [FrameCounter],2
JZ @@frame2
MOV SI,OFFSET SpiPosScr2
MOV BP,SCRW*200*2 ; 2 -> 2
JMP SHORT @@endframe
@@frame2:
TEST [FrameCounter],1
JZ @@frame3
MOV SI,OFFSET SpiPosScr1
MOV BP,SCRW*200*1 ; 1 -> 1
JMP SHORT @@endframe
@@frame3:
MOV SI,OFFSET SpiPosScr0
MOV BP,SCRW*200*0 ; 0 -> 0
@@endframe:
PUSH SI
MOV DI,[SpiralPosRot]
MOV BX,[DI+4]
MOV [SI+2],BX
MOV SI,[DI]
MOV DI,[DI+2]
NEG BX
CALL DrawSpiralXY
POP SI
MOV [SI],DI
RET
; =======================================
; =======================================
; =======================================
; =======================================
; =======================================
; =======================================
.DATA
CRTCregs LABEL BYTE ; Modo 13h
DB 11h, 04h ; End vertical retrace. (0-0Fh) ; DB 11h, 8Eh
DB 00h, 64h ; Horizontal total. ; DB 00h, 5Fh
DB 01h, 4Fh ; Horizontal display enable end. ; DB 01h, 4Fh
DB 02h, 50h ; Start horizontal blanking. ; DB 02h, 50h
DB 03h, 80h+07h ; End horizontal blanking. (0-1Fh) ; DB 03h, 82h
DB 04h, 5Bh ; Start horizontal retrace. ; DB 04h, 54h
DB 05h, 80h+05h ; End horizontal retrace. (0-1Fh) ; DB 05h, 80h
DB 06h,0FFh ; Vertical total. (+7.0 +7.5) ; DB 06h, BFh
DB 07h, 00011111b ; Overflow (high bits of vertical registers). ; DB 07h, 1Fh
DB 08h, 00h ; DB 08h, 00h
DB 09h, 41h ; DB 09h, 41h
DB 0Ah, 00h ; DB 0Ah, 00h
DB 0Bh, 00h ; DB 0Bh, 00h
DB 0Ch, 00h ; DB 0Ch, 00h
DB 0Dh, 00h ; DB 0Dh, 00h
DB 0Eh, 00h ; DB 0Eh, 00h
DB 0Fh, 00h ; DB 0Fh, 00h
DB 10h,0C0h ; Start vertical retrace. (+7.2 +7.7) ; DB 10h, 9Ch
;
; 11h ────┘ ; End vertical retrace. (0-0Fh)
DB 12h, 8Fh ; Vertical display enable end. (+7.1 +7.6) ; DB 12h, 8Fh
DB 13h, 28h ; DB 13h, 28h
DB 14h, 40h ; DB 14h, 40h
DB 15h,097h ; Start vertical blanking. (+7.3 +9.5) ; DB 15h, 96h
DB 16h,0F8h ; End vertical blanking. ; DB 16h, B9h
DB 17h,0A3h ; DB 17h, A3h
DB 18h,0FFh ; DB 18h, FFh
ALIGN 2
FrameCounter DW 0
RandSeed DW 348Bh
RandSeed2 DW 7F34h
RandSeed3 DW 32bfh
ALIGN 2
FadeCounter DW 0
NormalPalette LABEL BYTE
; ----- Normal Palette. ------------
DB 0, 0, 0
DB 50*2*3 DUP (0)
CenterColor1 LABEL BYTE
DB 0, 0, 0
CenterColor2 LABEL BYTE
DB 0, 0, 0
DB (128-50*2-3)*3 DUP (0)
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0
IguLogoFirstColor LABEL BYTE
; DB 31, 22, 33
; DB 28, 20, 30, 26, 17, 27, 24, 15, 24, 21, 12, 22
; DB 19, 10, 19
DB 6*3 DUP (0)
DB 3, 3, 3, 5, 5, 5, 7, 7, 7
DB 9, 9, 9, 10, 10, 10, 12, 12, 12, 14, 14, 14
DB 19, 10, 19, 21, 12, 22, 24, 15, 24, 26, 17, 27
DB 31, 22, 33, 33, 24, 35, 41, 21, 29, 40, 19, 27
DB 39, 17, 25, 38, 15, 23, 31, 10, 31, 33, 11, 33
DB 35, 11, 35, 37, 12, 37, 39, 13, 39, 41, 13, 41
DB 43, 14, 43, 45, 15, 45, 46, 15, 46, 48, 16, 48
DB 50, 17, 50, 52, 17, 52, 54, 18, 54, 56, 19, 56
DB 58, 19, 58, 60, 20, 60, 60, 19, 20, 60, 17, 16
DB 60, 15, 12, 60, 10, 5, 59, 9, 5, 56, 9, 4
DB 52, 8, 4, 49, 7, 4, 45, 7, 3, 41, 6, 3
DB 38, 5, 3, 34, 5, 2, 31, 4, 2, 27, 3, 2
DB 23, 3, 1, 20, 2, 1, 16, 1, 1, 13, 1, 0
DB 9, 0, 0, 0, 5, 10, 0, 5, 12, 0, 5, 13
DB 0, 5, 15, 0, 6, 17, 0, 6, 19, 0, 6, 20
DB 0, 6, 22, 0, 6, 24, 0, 6, 25, 0, 7, 27
DB 0, 7, 29, 0, 7, 31, 0, 7, 32, 0, 7, 34
DB 0, 7, 36, 0, 8, 37, 0, 8, 39, 0, 8, 41
DB 0, 8, 42, 0, 8, 44, 0, 8, 46, 0, 9, 48
DB 0, 9, 49, 0, 9, 51, 0, 9, 53, 0, 9, 54
DB 0, 9, 56, 0, 10, 58, 0, 10, 60, 0, 10, 61
DB 0, 10, 63, 8, 20, 54, 12, 20, 56, 14, 22, 56
DB 16, 24, 57, 18, 27, 57, 21, 29, 57, 0, 31, 63
DB 10, 43, 43, 10, 41, 41, 10, 39, 39, 10, 37, 37
DB 10, 35, 35, 10, 33, 33, 10, 31, 31, 13, 44, 7
DB 15, 47, 7, 16, 50, 8, 17, 53, 9, 40, 22, 13
; DB 768-($-NormalPalette) DUP(0)
EmptyPalette DB 768 DUP(0)
SpiralPalette DB 2*50*3 DUP(0)
SpiralPos1 DB 0
SpiralPos2 DB 0
FadeData1 DW 0, 0, 0
FadeData2 DW 0, 0, 0
WorkSecondPal DB 1
PixelationSkipOffset DW 0
FirstPalRot DW OFFSET PalInc
SecondPalRot DW OFFSET PalInc
SpecialSecondPal DW 0
SpiralPosRotList LABEL WORD
INCLUDE SpiPoss.INC
EndSpiralPosRot LABEL WORD
SpiralPosRot DW OFFSET SpiralPosRotList
; OFF,size
SpiPosScr0 DW 0, 57
SpiPosScr1 DW 0, 1
SpiPosScr2 DW 0, 1
END
; ------------------------ End of SPI.ASM ---------------------------